﻿/**
* @author Márcio d'Ávila
* @version 1.03, 2004-2008
* http://www.mhavila.com.br/topicos/web/cpf_cnpj.html
*
* Licenciado sob os termos da licença Creative Commons,
* Atribuição - Compartilhamento pela mesma licença 2.5:
* http://creativecommons.org/licenses/by-sa/2.5/br/
*
* PROTÓTIPOS:
* método String.lpad(int pSize, char pCharPad)
* método String.trim()
*
* String unformatNumber(String pNum)
* String formatCpfCnpj(String pCpfCnpj, boolean pUseSepar, boolean pIsCnpj)
* String dvCpfCnpj(String pEfetivo, boolean pIsCnpj)
* boolean isCpf(String pCpf)
* boolean isCnpj(String pCnpj)
* boolean isCpfCnpj(String pCpfCnpj)
*/


var NUM_DIGITOS_CPF = 11;
var NUM_DIGITOS_CNPJ = 14;
var NUM_DGT_CNPJ_BASE = 8;


/**
* Adiciona método lpad() à classe String.
* Preenche a String à esquerda com o caractere fornecido,
* até que ela atinja o tamanho especificado.
*/
String.prototype.lpad = function(pSize, pCharPad) {
    var str = this;
    var dif = pSize - str.length;
    var ch = String(pCharPad).charAt(0);
    for (; dif > 0; dif--) str = ch + str;
    return (str);
} //String.lpad


/**
* Adiciona método trim() à classe String.
* Elimina brancos no início e fim da String.
*/
String.prototype.trim = function() {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
} //String.trim


/**
* Elimina caracteres de formatação e zeros à esquerda da string
* de número fornecida.
* @param String pNum
*      String de número fornecida para ser desformatada.
* @return String de número desformatada.
*/
function unformatNumber(pNum) {
    return String(pNum).replace(/\D/g, "").replace(/^0+/, "");
} //unformatNumber


/**
* Formata a string fornecida como CNPJ ou CPF, adicionando zeros
* à esquerda se necessário e caracteres separadores, conforme solicitado.
* @param String pCpfCnpj
*      String fornecida para ser formatada.
* @param boolean pUseSepar
*      Indica se devem ser usados caracteres separadores (. - /).
* @param boolean pIsCnpj
*      Indica se a string fornecida é um CNPJ.
*      Caso contrário, é CPF. Default = false (CPF).
* @return String de CPF ou CNPJ devidamente formatada.
*/
function formatCpfCnpj(pCpfCnpj, pUseSepar, pIsCnpj) {
    if (pIsCnpj == null) pIsCnpj = false;
    if (pUseSepar == null) pUseSepar = true;
    var maxDigitos = pIsCnpj ? NUM_DIGITOS_CNPJ : NUM_DIGITOS_CPF;
    var numero = unformatNumber(pCpfCnpj);

    numero = numero.lpad(maxDigitos, '0');

    if (!pUseSepar) return numero;

    if (pIsCnpj) {
        reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
        numero = numero.replace(reCnpj, "$1.$2.$3/$4-$5");
    }
    else {
        reCpf = /(\d{3})(\d{3})(\d{3})(\d{2})$/;
        numero = numero.replace(reCpf, "$1.$2.$3-$4");
    }
    return numero;
} //formatCpfCnpj


/**
* Calcula os 2 dígitos verificadores para o número-efetivo pEfetivo de
* CNPJ (12 dígitos) ou CPF (9 dígitos) fornecido. pIsCnpj é booleano e
* informa se o número-efetivo fornecido é CNPJ (default = false).
* @param String pEfetivo
*      String do número-efetivo (SEM dígitos verificadores) de CNPJ ou CPF.
* @param boolean pIsCnpj
*      Indica se a string fornecida é de um CNPJ.
*      Caso contrário, é CPF. Default = false (CPF).
* @return String com os dois dígitos verificadores.
*/
function dvCpfCnpj(pEfetivo, pIsCnpj) {
    if (pIsCnpj == null) pIsCnpj = false;
    var i, j, k, soma, dv;
    var cicloPeso = pIsCnpj ? NUM_DGT_CNPJ_BASE : NUM_DIGITOS_CPF;
    var maxDigitos = pIsCnpj ? NUM_DIGITOS_CNPJ : NUM_DIGITOS_CPF;
    var calculado = formatCpfCnpj(pEfetivo + "00", false, pIsCnpj);
    calculado = calculado.substring(0, maxDigitos - 2);
    var result = "";

    for (j = 1; j <= 2; j++) {
        k = 2;
        soma = 0;
        for (i = calculado.length - 1; i >= 0; i--) {
            soma += (calculado.charAt(i) - '0') * k;
            k = (k - 1) % cicloPeso + 2;
        }
        dv = 11 - soma % 11;
        if (dv > 9) dv = 0;
        calculado += dv;
        result += dv
    }

    return result;
} //dvCpfCnpj


/**
* Testa se a String pCpf fornecida é um CPF válido.
* Qualquer formatação que não seja algarismos é desconsiderada.
* @param String pCpf
*      String fornecida para ser testada.
* @return <code>true</code> se a String fornecida for um CPF válido.
*/
function isCpf(pCpf) {
    var numero = formatCpfCnpj(pCpf, false, false);
    if (numero.length > NUM_DIGITOS_CPF) return false;

    var base = numero.substring(0, numero.length - 2);
    var digitos = dvCpfCnpj(base, false);
    var algUnico, i;

    // Valida dígitos verificadores
    if (numero != "" + base + digitos) return false;

    /* Não serão considerados válidos os seguintes CPF:
    * 000.000.000-00, 111.111.111-11, 222.222.222-22, 333.333.333-33, 444.444.444-44,
    * 555.555.555-55, 666.666.666-66, 777.777.777-77, 888.888.888-88, 999.999.999-99.
    */
    algUnico = true;
    for (i = 1; algUnico && i < NUM_DIGITOS_CPF; i++) {
        algUnico = (numero.charAt(i - 1) == numero.charAt(i));
    }
    return (!algUnico);
} //isCpf


/**
* Testa se a String pCnpj fornecida é um CNPJ válido.
* Qualquer formatação que não seja algarismos é desconsiderada.
* @param String pCnpj
*      String fornecida para ser testada.
* @return <code>true</code> se a String fornecida for um CNPJ válido.
*/
function isCnpj(pCnpj) {
    var numero = formatCpfCnpj(pCnpj, false, true);
    if (numero.length > NUM_DIGITOS_CNPJ) return false;

    var base = numero.substring(0, NUM_DGT_CNPJ_BASE);
    var ordem = numero.substring(NUM_DGT_CNPJ_BASE, 12);
    var digitos = dvCpfCnpj(base + ordem, true);
    var algUnico;

    // Valida dígitos verificadores
    if (numero != "" + base + ordem + digitos) return false;

    /* Não serão considerados válidos os CNPJ com os seguintes números BÁSICOS:
    * 11.111.111, 22.222.222, 33.333.333, 44.444.444, 55.555.555,
    * 66.666.666, 77.777.777, 88.888.888, 99.999.999.
    */
    algUnico = numero.charAt(0) != '0';
    for (i = 1; algUnico && i < NUM_DGT_CNPJ_BASE; i++) {
        algUnico = (numero.charAt(i - 1) == numero.charAt(i));
    }
    if (algUnico) return false;

    /* Não será considerado válido CNPJ com número de ORDEM igual a 0000.
    * Não será considerado válido CNPJ com número de ORDEM maior do que 0300
    * e com as três primeiras posições do número BÁSICO com 000 (zeros).
    * Esta crítica não será feita quando o no BÁSICO do CNPJ for igual a 00.000.000.
    */
    if (ordem == "0000") return false;
    return (base == "00000000"
		|| parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000");
} //isCnpj


/**
* Testa se a String pCpfCnpj fornecida é um CPF ou CNPJ válido.
* Se a String tiver uma quantidade de dígitos igual ou inferior
* a 11, valida como CPF. Se for maior que 11, valida como CNPJ.
* Qualquer formatação que não seja algarismos é desconsiderada.
* @param String pCpfCnpj
*      String fornecida para ser testada.
* @return <code>true</code> se a String fornecida for um CPF ou CNPJ válido.
*/
function isCpfCnpj(pCpfCnpj) {
    var numero = pCpfCnpj.replace(/\D/g, "");
    if (numero.length > NUM_DIGITOS_CPF)
        return isCnpj(pCpfCnpj)
    else
        return isCpf(pCpfCnpj);
} //isCpfCnpj

/*
*
* Função de Validação de CPF para ser utilizada com o Custom Validator do asp.net
*
*/
function ValidaCPF(src, args) {

    var cpf = args.Value;

    if (isCpf(cpf)) {
        args.IsValid = true;
    }
    else {
        args.IsValid = false;
    }


}
/* Função de validação de telefone e telefone celular */

function isTelefone(tel) {
    
    exp = /^((\(0?[1-9][0-9]\))|(0?[1-9][0-9]))[ -.]?([1-9][0-9]{3})[ -.]?([0-9]{4})$/;
    
    var regExp = new RegExp(exp);

    if (regExp.test(tel)) {
        return true;
    }
    else {
        return false;
    }

}

function isCelular(cel) {


    exp = /((([7-9])(\d{3})([-])(\d{4}))|(([7-9])(\d{7})))/;
    var regExp = new RegExp(exp);

    
    if ((isTelefone(cel)) && (regExp.test(cel.substring(2,10)))) {
        return true;
    }
    else {
        return false;
    }


}

function ValidaTelefone(src, args) {

    var telefone = args.Value;

    if (isTelefone(telefone)) {
        args.IsValid = true;
    }
    else {
        args.IsValid = false;
    }
}

function ValidaCelular(src, args) {

    var celular = args.Value;

    if (isCelular(celular)) {
        args.IsValid = true;
    }
    else {
        args.IsValid = false;
    }
}

// Notifications Pop-Up Code

/************************************************************************
* @name: bPopup
* @author: (c) Bjoern Klinggaard (http://dinbror.dk/bpopup)
* @version: 0.5.1.min
************************************************************************/
(function(a) { a.fn.bPopup = function(h, j) { function s() { b.css({ left: !o.follow[1] && k ? d : c.scrollLeft() + d, position: "absolute", top: !o.follow[0] && l ? e : c.scrollTop() + e, "z-index": o.zIndex }).appendTo(o.appendTo).hide(1, function() { a.isFunction(o.onOpen) && o.onOpen.call(b); if (o.loadUrl != null) switch (o.contentContainer = o.contentContainer == null ? b : a(o.contentContainer), o.content) { case "iframe": a('<iframe scrolling="no" frameborder="0"></iframe>').attr("src", o.loadUrl).appendTo(o.contentContainer); break; default: o.contentContainer.load(o.loadUrl) } }).fadeIn(o.fadeSpeed, function() { a.isFunction(j) && j() }); t() } function i() { o.modal && a("#bModal").fadeOut(o.fadeSpeed, function() { a("#bModal").remove() }); b.fadeOut(o.fadeSpeed, function() { o.loadUrl != null && o.contentContainer.empty() }); o.scrollBar || a("html").css("overflow", "auto"); a("." + o.closeClass).die("click"); a("#bModal").die("click"); c.unbind("keydown.bPopup"); f.unbind(".bPopup"); b.data("bPopup", null); a.isFunction(o.onClose) && setTimeout(function() { o.onClose.call(b) }, o.fadeSpeed); return !1 } function u() { if (n || v) { var a = [c.height(), c.width()]; return { "background-color": o.modalColor, height: a[0], left: m(), opacity: 0, position: "absolute", top: 0, width: a[1], "z-index": o.zIndex - 1} } else return { "background-color": o.modalColor, height: "100%", left: 0, opacity: 0, position: "fixed", top: 0, width: "100%", "z-index": o.zIndex - 1} } function t() { a("." + o.closeClass).live("click", i); o.modalClose && a("#bModal").live("click", i).css("cursor", "pointer"); (o.follow[0] || o.follow[1]) && f.bind("scroll.bPopup", function() { b.stop().animate({ left: o.follow[1] ? c.scrollLeft() + d : d, top: o.follow[0] ? c.scrollTop() + e : e }, o.followSpeed) }).bind("resize.bPopup", function() { if (o.modal && n) { var a = [c.height(), c.width()]; p.css({ height: a[0], width: a[1], left: m() }) } g = q(b, o.amsl); o.follow[0] && (e = l ? e : c.scrollTop() + g[0]); o.follow[1] && (d = k ? d : c.scrollLeft() + g[1]); b.stop().animate({ left: d, top: e }, o.followSpeed) }); o.escClose && c.bind("keydown.bPopup", function(a) { a.which == 27 && i() }) } function m() { return f.width() < a("body").width() ? 0 : (a("body").width() - f.width()) / 2 } function q(a, b) { var c = (f.height() - a.outerHeight(!0)) / 2 - b, d = (f.width() - a.outerWidth(!0)) / 2 + m(); return [c < 20 ? 20 : c, d] } a.isFunction(h) && (j = h, h = null); o = a.extend({}, a.fn.bPopup.defaults, h); o.scrollBar || a("html").css("overflow", "hidden"); var b = a(this), p = a('<div id="bModal"></div>'), c = a(document), f = a(window), g = q(b, o.amsl), l = o.position[0] != "auto", k = o.position[1] != "auto", e = l ? o.position[0] : g[0], d = k ? o.position[1] : g[1], r = navigator.userAgent.toLowerCase(), v = r.indexOf("iphone") != -1, n = /msie 6/i.test(r) && typeof window.XMLHttpRequest != "object"; this.close = function() { o = b.data("bPopup"); i() }; return this.each(function() { b.data("bPopup") || (o.modal && p.css(u()).appendTo(o.appendTo).animate({ opacity: o.opacity }, o.fadeSpeed), b.data("bPopup", o), s()) }) }; a.fn.bPopup.defaults = { amsl: 50, appendTo: "body", closeClass: "bClose", content: "ajax", contentContainer: null, escClose: !0, fadeSpeed: 250, follow: [!0, !0], followSpeed: 500, loadUrl: null, modal: !0, modalClose: !0, modalColor: "#000", onClose: null, onOpen: null, opacity: 0.7, position: ["auto", "auto"], scrollBar: !0, zIndex: 9999} })(jQuery);

// Modal status

$(document).ready(function() {
    $(".modalStatus").bPopup({ appendTo: 'body', fadeSpeed: 'slow', followSpeed: 'slow', opacity: 0.8, modalClose: false, closeClass: 'closeModalStatus' });
    return false
});

// Modal on submit

$(document).ready(function() {

    $('form').bind('submit', function() {
        if (Page_IsValid) {
            $("input[type=button]").attr("disabled", "disabled");
            $('#submitOverlay').bPopup({ appendTo: 'body', fadeSpeed: 1, opacity: 0.6, modalClose: false, escClose: false });
        }
    });
});




function ShowUpdateProgress(message) {
    $('#StatusProgressMessage').text(message);
    $("#StatusProgress").bPopup({ appendTo: 'body', fadeSpeed: 1, opacity: 0.6, modalClose: false, escClose: false });

}


function HideUpdateProgress() {
    $('StatusProgressMessage').text('');
    $("#StatusProgress").bPopup().close();

}
		